-
Notifications
You must be signed in to change notification settings - Fork 270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【Hackathon No.19】Add ASGD RFC #68
Conversation
Signed-off-by: tiancaishaonvjituizi <452565578@qq.com>
在调研代码的过程中,我提交了一个 PR 修复了一些 Paddle 中有问题的代码。可以一起 Review 一下~ PaddlePaddle/Paddle#41045 |
PR格式检查通过,你的PR将接受Paddle专家以及开源社区的review,请及时关注PR动态。 |
|
||
## 底层OP设计 | ||
|
||
基本可以仿照飞桨 SGD 优化器的实现,实现 paddle/fluid/operators/optimizers/asgd_op.cc 和相应的 asgd_kernel.h/.cc/.cu。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
对PyTorch的调研很详细,关于OP实现这部分也写一下详细点的思路吧,让其他开发者根据设计文档也有实现的思路。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
好的,补充啦
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
还是太简介啦😂 ,这样对其他开发者起不到实际指导的作用。
希望能够把论文中的思想与代码结合的方式展现,所以最好包含以下两部分吧:
1)说明ASGD的思想方法
2)方法如何在paddle的optimizer中实现
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
添加了较为详细的伪代码,请再看一下
class paddle.fluid.optimizer.ASGDOptimizer(learning_rate, parameter_list=None, regularization=None, name=None) | ||
``` | ||
|
||
和飞桨中其它优化器的风格保持一致。weight_decay 通过 `regularization` 参数设置,支持 L1/L2 正则。而学习率用 LR Scheduler 来控制,不内置在优化器内。并新增一个 LRScheduler 实现 [2] 中提出的学习率更新策略(具体名字可以后续决定),用户也可以通过使用其它 LRScheduler 或者 LambdaLR,自由选择其它的学习率更新策略。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
asgd的学习率更新方法是否是asgd本身所要求的?如果学习率更新方法是asgd所特有,就不应该另外增加一个LR Scheduler。
【建议将asgd论文中的理论公式与代码实现做对应分析】。
完全参考PyTorch 代码实现并不可靠
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
可能是我写的不够清楚。ASGD 本身没有假设某一种学习率,仅仅只是对参数做平均而已,这一点可以在维基百科和一些学校教材里看到。
此外,ASGD 是在 https://dl.acm.org/doi/10.1137/0330046 和 https://ecommons.cornell.edu/handle/1813/8664 提出的,而 PyTorch ASGD 所用的学习率是在很晚很晚之后的 https://arxiv.org/abs/1107.2490 才提出的,这也可以证明 PyTorch ASGD 所用的学习率更新方法不会是 ASGD 本身要求的,这一点在 PyTorch ASGD 所参考的 bottou-sgd README 里有明确的说明。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我把上面这段解释加入到 RFC 里了,请再看一下。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
原论文Acceleration of stochastic approximation by averaging中的t^-1是否说明参数更新量也随着时间需要逐渐减少
bottou-sgd README中也说明了ASGD需要配合学习率的逐渐衰减。
所以我理解这个学习率更新方法应该是ASGD所要求的。(注意这个学习率衰减的原因与深度学习的学习率下降不是一回事,虽然有些LR Schduler也能起到类似的作用,但是彼此是独立的)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
其实我更关心的不是学习率是否衰减的问题,而是我们是否对ASGD方法和论文已经分析透彻了
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
原论文Acceleration of stochastic approximation by averaging中的t^-1是否说明参数更新量也随着时间需要逐渐减少
这段话不是讲 ASGD 的,是说 “SGD 在满足这个条件的情况下也有和 ASGD 一样最佳的收敛速度,但这个条件在实际中很难满足”。
注意这个学习率衰减的原因与深度学习的学习率下降不是一回事,虽然有些LR Schduler也能起到类似的作用,但是彼此是独立的
这句话想表达的意思是不是这样:“ASGD 对学习率衰减策略是有理论上的要求的,不满足要求 ASGD 在理论上就不会有效果” 。
这句话是对的,ASGD 原论文对学习率有一些假设:
但可以看到这些假设是比较宽泛的,可以构造出无数种具体的衰减策略满足这些假设。此外,不满足这些假设的学习率衰减策略就需要被禁止吗?我认为不是的,研究者可能就是想研究 Averaged SGD 在某些特殊条件下的表现。这篇文章 https://arxiv.org/abs/1107.2490 就提到了两个使用固定学习率的研究:
因此,不管是从 ASGD 算法本身,还是从 API 的正交性、可组合性上来说,我认为按照 LR Scheduler + 一个不对学习率有任何假设的 Averaged SGD 的思路来实现都是更好的做法。
再附上 sklearn 的 SGD 实现作为另一个旁证:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier ,可以看到 average
只是 SGD 的参数之一,是和 learning_rate
、penalty
这些参数同等且正交的,并不会因为 average=True 就禁止用户自由设置学习率。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK
添加 Hackathon 任务 19 ASGD 的 RFC